Link-Cut-Tree 的懒标记下传正确食用方法。
1:+ u v c
:将$u$到$v$的路径上的点的权值都加上自然数$c$;
解决方法:
很显然,我们可以$split(u,v)$来提取
u,v
这一段区间,提取完了将$Splay(v)$,然后直接在v
上打加法标记$add$即可。- 代码:
1 | inline void pushadd(ll x,ll val){//打标记 |
2:- u1 v1 u2 v2
:将树中原有的边$(u1,v1)$删除,加入一条新边$(u2,v2)$,保证操作完之后仍然是一棵树;
- 解决方法:
删除边即$cut$操作,加边即$link$操作。
代码:
1 | inline void link(ll x,ll y){ |
3:* u v c
:将$u$到$v$的路径上的点的权值都乘上自然数$c$;
- 解决方法:
很显然,我们可以$split(u,v)$来提取
u,v
这一段区间,提取完了将$Splay(v)$,然后直接在v
上打乘法标记$mul$即可。(跟第一个操作基本同理)代码:
1 | inline void pushmul(ll x,ll val){//打标记 |
4:/ u v
:询问$u$到$v$的路径上的点的权值和,求出答案对于51061
的余数。
- 解决方法:
$Splay(v)$时已经将所有节点更新过了(懒标记下传过了),所以最后只需输出$s[v]$即可。
代码:
1 | //(main函数中): |
Code:
1 |
|
因为$51061 * 51061$是会越过$int$界限的,所以我开的$longlong$(当然也可以开无符号$int$)
所以就没了。。。。。。
本文标题:【题解】 [国家集训队]Tree LCT luogu1501/bzoj2631
文章作者:Qiuly
发布时间:2019年02月17日 - 00:00
最后更新:2019年05月06日 - 14:04
原始链接:http://qiulyblog.github.io/2019/02/17/[题解]luoguP1501/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。